﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MVCPets.Extensions;

namespace MVCPets.Tests.Extensions
{
  [TestClass]
  public class DateTests
  {
    public DateTime dt { get; set; }

    [TestInitialize()]
    public void MyTestInitialize()
    {
      dt = DateTime.Now;
    }

    [TestMethod]
    public void Test_Tomorrow()
    {
      Assert.IsTrue(dt.Tomorrow().Day == dt.AddDays(1).Day);
    }

    [TestMethod]
    public void Test_Yesterday()
    {
      Assert.IsTrue(dt.Yesterday().Day == dt.AddDays(-1).Day);
    }

    [TestMethod]
    public void Test_2_Days_Ago()
    {
      DateTime newDt = 2.DaysAgo();
      Assert.IsTrue(newDt.Day == dt.AddDays(-2).Day);
    }

    [TestMethod]
    public void Test_2_Days_From_Now()
    {
      DateTime newDt = 2.DaysFromNow();
      Assert.IsTrue(newDt.Day == dt.AddDays(2).Day);
    }

    [TestMethod]
    public void Test_2_Hours_From_Now()
    {
      DateTime newDt = 2.HoursFromNow();
      Assert.IsTrue(newDt.Hour == dt.AddHours(2).Hour);
    }

    [TestMethod]
    public void Test_2_Hours_Ago()
    {
      DateTime newDt = 2.HoursAgo();
      Assert.IsTrue(newDt.Hour == dt.AddHours(-2).Hour);
    }

    [TestMethod]
    public void Test_2_Minutes_From_Now()
    {
      DateTime newDt = 2.MinutesFromNow();
      Assert.IsTrue(newDt.Minute == dt.AddMinutes(2).Minute);
    }

    [TestMethod]
    public void Test_2_Minutes_Ago()
    {
      DateTime newDt = 2.MinutesAgo();
      Assert.IsTrue(newDt.Minute == dt.AddMinutes(-2).Minute);
    }

    [TestMethod]
    public void Test_2_Seconds_From_Now()
    {
      DateTime newDt = 2.SecondsFromNow();
      Assert.IsTrue(newDt.Second == dt.AddSeconds(2).Second);
    }

    [TestMethod]
    public void Test_2_Seconds_Ago()
    {
      DateTime newDt = 2.SecondsAgo();
      Assert.IsTrue(newDt.Second == dt.AddSeconds(-2).Second);
    }

    [TestMethod]
    public void Test_Diff_Date()
    {
      Assert.IsTrue(dt.Diff(dt.Tomorrow()).TotalDays == -1.0);
    }

    [TestMethod]
    public void Test_DiffDays()
    {
      Assert.IsTrue(dt.DiffDays(dt.Tomorrow()) == -1.0);
      Assert.IsTrue("1/1/2010".DiffDays("1/2/2010") == -1.0);
      Assert.IsTrue("1/1/2010".DiffDays("BOB") == 0);
      Assert.IsTrue("BOB".DiffDays("1/2/2010") == 0);
    }

    [TestMethod]
    public void Test_DiffHours()
    {
      Assert.IsTrue(dt.DiffHours(dt.AddHours(2)) == -2.0);
      Assert.IsTrue(dt.ToString().DiffHours(dt.AddHours(2).ToString()) == -2.0);

      Assert.IsTrue("BOB".DiffHours(dt.AddHours(2).ToString()) == 0);
      Assert.IsTrue(dt.ToString().DiffHours("BOB") == 0);
    }

    [TestMethod]
    public void Test_DiffMinutes()
    {
      Assert.IsTrue(dt.DiffMinutes(dt.AddMinutes(2)) == -2.0);
      Assert.IsTrue(dt.ToString().DiffMinutes(dt.AddMinutes(2).ToString()) == -2.0);

      Assert.IsTrue("BOB".DiffMinutes(dt.AddMinutes(2).ToString()) == 0);
      Assert.IsTrue(dt.ToString().DiffMinutes("BOB") == 0);
    }

    [TestMethod]
    public void Test_ReadableDiff()
    {
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddMinutes(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddMinutes(2).AddSeconds(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddMinutes(1))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddHours(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddHours(2).AddMinutes(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddHours(2).AddMinutes(2).AddSeconds(10))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddHours(-2).AddMinutes(-2).AddSeconds(-10))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddSeconds(-1))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddHours(-2).AddMinutes(-2).AddSeconds(-10).AddYears(10))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.ReadableDiff(dt.AddHours(-2).AddMinutes(-2).AddSeconds(-10).AddYears(10).AddDays(2))));

      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddMinutes(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddMinutes(2).AddSeconds(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddMinutes(1))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddHours(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddHours(2).AddMinutes(2))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddHours(2).AddMinutes(2).AddSeconds(10))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddHours(-2).AddMinutes(-2).AddSeconds(-10))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddSeconds(-1))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddHours(-2).AddMinutes(-2).AddSeconds(-10).AddYears(10))));
      Assert.IsTrue(!string.IsNullOrEmpty(dt.TimeDiff(dt.AddHours(-2).AddMinutes(-2).AddSeconds(-10).AddYears(10).AddDays(2))));
    }

    [TestMethod]
    public void Test_Between()
    {
      Assert.IsTrue(dt.IsBetween(dt.Yesterday(), dt.Tomorrow()));
      Assert.IsFalse(dt.Yesterday().IsBetween(dt.Yesterday(), dt.Tomorrow()));

      Assert.IsTrue(dt.IsBetween(dt, dt.Tomorrow(), BetweenOptions.IncludeLower));
      Assert.IsFalse(dt.IsBetween(dt.Yesterday(), dt, BetweenOptions.IncludeLower));
      Assert.IsTrue(dt.IsBetween(dt.Yesterday(), dt, BetweenOptions.IncludeHigher));
      Assert.IsFalse(dt.IsBetween(dt, dt.Tomorrow(), BetweenOptions.IncludeHigher));

      Assert.IsTrue(dt.IsBetween(dt, dt.Tomorrow(), BetweenOptions.IncludeBoth));
      Assert.IsTrue(dt.IsBetween(dt.Yesterday(), dt, BetweenOptions.IncludeBoth));
    }

    [TestMethod]
    public void Test_FiscalYear()
    {
      int currFiscalyear = dt.Year;
      if (dt.Month >= 7) currFiscalyear++;
      Assert.IsTrue(dt.FiscalYear() == currFiscalyear);
      Assert.IsTrue(!string.IsNullOrEmpty(dt.FiscalYearString()));
    }

    [TestMethod]
    public void Test_First()
    {
      Assert.IsTrue(dt.First().Day == 1 && dt.Month == dt.First().Month);
      Assert.IsTrue(dt.First(DayOfWeek.Tuesday).DayOfWeek == DayOfWeek.Tuesday);
    }

    [TestMethod]
    public void Test_Last()
    {
      Assert.IsTrue(dt.Last().Day > 27 && dt.Month == dt.First().Month);      
    }

    [TestMethod]
    public void Test_IsDate()
    {
      Assert.IsTrue(("1/1/2010").IsDate());
    }

    [TestMethod]
    public void Test_GetFormattedDate()
    {
      Assert.IsTrue(!string.IsNullOrEmpty(dt.GetFormattedMonthAndDay()));
    }
  }
}
